package 反射;

import java.lang.reflect.Method;

/**
 * @author shy_black
 * @date 2019/3/21 14:43
 * @Description:-->借助Method类的实例化对象完成操作
 * //1.取得class对象
 * //2.组装方法名称
 * //3.取得method对象
 * //4.取得Person类的实例化对象，而后调用方法
 * //5.用方法对象.invoke()传入....调用要调用的方法
 *
 * ---->需要在启动程序时传入getter，setter的属性名称
 * 例如需要获得name属性的值，需要获得getName，则传入name
 */

public class _重要_反射调用普通方法 {
    public static void main(String[] args) throws Exception {
//        Person per = new Person();
//        per.setName("张三");
//        System.out.println(per.getName());

        //1.取得class对象
        Class<Person> cls = Person.class;
        //2.组装方法名称
        String setMethodName = "set" + initCap(args[0]);
        String getMethodName = "get" + initCap(args[0]);
        //3.取得method对象
        Method setMethod = cls.getMethod(setMethodName, String.class);//setName的方法名，参数类型
        Method getMethod = cls.getMethod(getMethodName);//getName的方法名，该方法无参，所以不用传参数
        //4.取得Person类的实例化对象，而后调用方法
        Person per = cls.newInstance();
        //用方法对象.invoke()传入....调用要调用的方法
        setMethod.invoke(per, "张三"); //相当于per.setName("张三");
        System.out.println(getMethod.invoke(per));//相当于System.out.println( per,getName() );
    }

    private static String initCap(String str) {
        return str.substring(0, 1).toUpperCase() + str.substring(1);
    }
}

class Person {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}